package com.memora.seguranca

import grails.transaction.Transactional
import com.memora.seguranca.SegUser
import com.memora.usuario.Telefone
import grails.validation.ValidationException

@Transactional
class SegUserService {

    /**
    * Servico responsável pela gravação de um novo usuário e telefone.
    * @param params
    * @return segUserInstance SegUse
    */
    SegUser saveService(params){
 
        SegUser segUserInstance  = new SegUser(params)

        if (segUserInstance == null) {

            return segUserInstance
        }

        if (segUserInstance.hasErrors()) {

            return segUserInstance
        }
 
        segUserInstance.save flush:true

        
        gravaTelefone(params, segUserInstance)
        

        return segUserInstance
    }

    /**
    * Servico responsável pela atualização de um usuário e telefone.
    * @param segUserInstance SegUser
    * @return segUserInstance SegUser
    */
    def updateService(SegUser segUserInstance, params){

        if (segUserInstance == null || segUserInstance.hasErrors()) {

            return segUserInstance
        }

        segUserInstance.save flush:true

        removeTelefone(segUserInstance)

        
        gravaTelefone(params, segUserInstance)
        

       return segUserInstance
    }

    /**
    * Servico responsável por destruir um usuário e seus números de telefones
    * @param segUserInstance SegUser
    * @return segUserInstance SegUser
    */
    SegUser deleteService(SegUser segUserInstance){

        try{
            removeTelefone(segUserInstance)

            segUserInstance.delete flush:true
        }catch(Exception e){
            return null
        }
        return segUserInstance
    }

    /**
    * Servico auxiliar responsável pela gravação do telefone.
    * @param numero def - Número do telefone, pode ser uma lista ou uma String
    * @param descricao def - Descrição do número, pode ser uma lista ou uma String
    * @param segUserInstance SegUser
    */
    private void gravaTelefone(params, SegUser segUserInstance){

        if(params.numeroTelefone && params.numeroTelefone != ""){

            def numero = params.numeroTelefone
            def descricao = params.descricaoNumero

            if(numero instanceof String || numero instanceof GString){

                def telefoneInstance = new Telefone(segUser         : segUserInstance,
                                                    numeroTelefone  : numero, 
                                                    descricaoNumero : descricao)            

                validaSalvaTelefone(telefoneInstance)

            }else{
                
                for(int i = 0; i < numero.size(); i++){

                    def telefoneInstance = new Telefone(segUser         : segUserInstance,
                                                        numeroTelefone  : numero[i], 
                                                        descricaoNumero : descricao[i])

                validaSalvaTelefone(telefoneInstance)
                }
            }
        }
    }

    /**
    * Servico auxiliar responsável por validar e gravar os dados do telefone.
    * @param telefoneInstance def - Dados do telefone a ser validado e gravado
    * @throws Retorna uma exceção se ouver erros ou se os dados forem nulos. 
    */
    private void validaSalvaTelefone(def telefoneInstance){


            if (telefoneInstance == null || telefoneInstance.hasErrors()) {

                println "Erro ao gravar o telefone: "+telefoneInstance.hasErrors()
                throw new ValidationException("Não foi possível gravar o telefone", telefoneInstance.errors)
                //return null
            }


            telefoneInstance.save(flush: true)
    }

    /**
    * Servico auxiliar responsável por remover os telefones armazenados.
    * @param segUserInstance SegUser
    */
    private void removeTelefone(SegUser segUserInstance){

        def telefoneList = Telefone.findAllBySegUser(segUserInstance)
        
        if(telefoneList instanceof List){
        
            for(telefoneInstance in telefoneList){
        
                telefoneInstance.delete flush:true
            }
        }else{
        
            telefoneList.delete flush:true
        }
    }
}
